package org.dromara.ai.domain.dto;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * AI模型信息DTO
 *
 * @author RuoYi
 * @since 2024-01-01
 */
@Data
@Accessors(chain = true)
public class AiModelInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 模型ID
     */
    private String id;

    /**
     * 模型名称
     */
    private String name;

    /**
     * 模型显示名称
     */
    private String displayName;

    /**
     * 模型描述
     */
    private String description;

    /**
     * 模型版本
     */
    private String version;

    /**
     * 提供商类型
     */
    private String provider;

    /**
     * 模型类型
     */
    private ModelType type;

    /**
     * 模型能力
     */
    private List<ModelCapability> capabilities;

    /**
     * 最大上下文长度
     */
    private Integer maxContextLength;

    /**
     * 最大输出长度
     */
    private Integer maxOutputLength;

    /**
     * 输入价格（每1K token）
     */
    private Double inputPrice;

    /**
     * 输出价格（每1K token）
     */
    private Double outputPrice;

    /**
     * 是否支持流式输出
     */
    private Boolean supportStream;

    /**
     * 是否支持函数调用
     */
    private Boolean supportFunction;

    /**
     * 是否支持工具调用
     */
    private Boolean supportTool;

    /**
     * 是否支持视觉
     */
    private Boolean supportVision;

    /**
     * 是否支持图像生成
     */
    private Boolean supportImageGeneration;

    /**
     * 是否支持语音
     */
    private Boolean supportAudio;

    /**
     * 是否可用
     */
    private Boolean available;

    /**
     * 模型状态
     */
    private ModelStatus status;

    /**
     * 创建时间
     */
    private LocalDateTime created;

    /**
     * 更新时间
     */
    private LocalDateTime updated;

    /**
     * 模型参数
     */
    private ModelParameters parameters;

    /**
     * 扩展信息
     */
    private Map<String, Object> extra;

    /**
     * 模型类型枚举
     */
    public enum ModelType {
        /**
         * 文本生成
         */
        TEXT_GENERATION("text_generation", "文本生成"),

        /**
         * 聊天对话
         */
        CHAT("chat", "聊天对话"),

        /**
         * 代码生成
         */
        CODE_GENERATION("code_generation", "代码生成"),

        /**
         * 图像生成
         */
        IMAGE_GENERATION("image_generation", "图像生成"),

        /**
         * 语音合成
         */
        TEXT_TO_SPEECH("text_to_speech", "语音合成"),

        /**
         * 语音识别
         */
        SPEECH_TO_TEXT("speech_to_text", "语音识别"),

        /**
         * 嵌入向量
         */
        EMBEDDING("embedding", "嵌入向量"),

        /**
         * 多模态
         */
        MULTIMODAL("multimodal", "多模态");

        private final String code;
        private final String name;

        ModelType(String code, String name) {
            this.code = code;
            this.name = name;
        }

        public String getCode() {
            return code;
        }

        public String getName() {
            return name;
        }
    }

    /**
     * 模型能力枚举
     */
    public enum ModelCapability {
        /**
         * 文本理解
         */
        TEXT_UNDERSTANDING("text_understanding", "文本理解"),

        /**
         * 文本生成
         */
        TEXT_GENERATION("text_generation", "文本生成"),

        /**
         * 对话聊天
         */
        CONVERSATION("conversation", "对话聊天"),

        /**
         * 代码理解
         */
        CODE_UNDERSTANDING("code_understanding", "代码理解"),

        /**
         * 代码生成
         */
        CODE_GENERATION("code_generation", "代码生成"),

        /**
         * 函数调用
         */
        FUNCTION_CALLING("function_calling", "函数调用"),

        /**
         * 工具使用
         */
        TOOL_USE("tool_use", "工具使用"),

        /**
         * 图像理解
         */
        IMAGE_UNDERSTANDING("image_understanding", "图像理解"),

        /**
         * 图像生成
         */
        IMAGE_GENERATION("image_generation", "图像生成"),

        /**
         * 语音识别
         */
        SPEECH_RECOGNITION("speech_recognition", "语音识别"),

        /**
         * 语音合成
         */
        SPEECH_SYNTHESIS("speech_synthesis", "语音合成"),

        /**
         * 文档分析
         */
        DOCUMENT_ANALYSIS("document_analysis", "文档分析"),

        /**
         * 知识问答
         */
        KNOWLEDGE_QA("knowledge_qa", "知识问答");

        private final String code;
        private final String name;

        ModelCapability(String code, String name) {
            this.code = code;
            this.name = name;
        }

        public String getCode() {
            return code;
        }

        public String getName() {
            return name;
        }
    }

    /**
     * 模型状态枚举
     */
    public enum ModelStatus {
        /**
         * 可用
         */
        AVAILABLE("available", "可用"),

        /**
         * 不可用
         */
        UNAVAILABLE("unavailable", "不可用"),

        /**
         * 维护中
         */
        MAINTENANCE("maintenance", "维护中"),

        /**
         * 已弃用
         */
        DEPRECATED("deprecated", "已弃用");

        private final String code;
        private final String name;

        ModelStatus(String code, String name) {
            this.code = code;
            this.name = name;
        }

        public String getCode() {
            return code;
        }

        public String getName() {
            return name;
        }
    }

    /**
     * 模型参数
     */
    @Data
    @Accessors(chain = true)
    public static class ModelParameters implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 默认温度
         */
        private Double defaultTemperature;

        /**
         * 最小温度
         */
        private Double minTemperature;

        /**
         * 最大温度
         */
        private Double maxTemperature;

        /**
         * 默认Top-p
         */
        private Double defaultTopP;

        /**
         * 最小Top-p
         */
        private Double minTopP;

        /**
         * 最大Top-p
         */
        private Double maxTopP;

        /**
         * 默认最大token数
         */
        private Integer defaultMaxTokens;

        /**
         * 最小最大token数
         */
        private Integer minMaxTokens;

        /**
         * 最大最大token数
         */
        private Integer maxMaxTokens;

        /**
         * 支持的停止词数量
         */
        private Integer maxStopSequences;

        /**
         * 其他参数
         */
        private Map<String, Object> others;
    }
}